/* SPDX-License-Identifier: GPL-2.0 OR MIT */
/*
 * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
 *
 * Based on public domain code from Daniel J. Bernstein and Peter Schwabe. This
 * began from SUPERCOP's curve25519/neon2/scalarmult.s, but has subsequently been
 * manually reworked for use in kernel space.
 */

#include <linux/linkage.h>

.text
.arch armv7-a
.fpu neon
.align 4

ENTRY(curve25519_neon)
	push		{r4-r11, lr}
	mov		ip, sp
	sub		r3, sp, #704
	and		r3, r3, #0xfffffff0
	mov		sp, r3
	movw		r4, #0
	movw		r5, #254
	vmov.i32	q0, #1
	vshr.u64	q1, q0, #7
	vshr.u64	q0, q0, #8
	vmov.i32	d4, #19
	vmov.i32	d5, #38
	add		r6, sp, #480
	vst1.8		{d2-d3}, [r6, : 128]!
	vst1.8		{d0-d1}, [r6, : 128]!
	vst1.8		{d4-d5}, [r6, : 128]
	add		r6, r3, #0
	vmov.i32	q2, #0
	vst1.8		{d4-d5}, [r6, : 128]!
	vst1.8		{d4-d5}, [r6, : 128]!
	vst1.8		d4, [r6, : 64]
	add		r6, r3, #0
	movw		r7, #960
	sub		r7, r7, #2
	neg		r7, r7
	sub		r7, r7, r7, LSL #7
	str		r7, [r6]
	add		r6, sp, #672
	vld1.8		{d4-d5}, [r1]!
	vld1.8		{d6-d7}, [r1]
	vst1.8		{d4-d5}, [r6, : 128]!
	vst1.8		{d6-d7}, [r6, : 128]
	sub		r1, r6, #16
	ldrb		r6, [r1]
	and		r6, r6, #248
	strb		r6, [r1]
	ldrb		r6, [r1, #31]
	and		r6, r6, #127
	orr		r6, r6, #64
	strb		r6, [r1, #31]
	vmov.i64	q2, #0xffffffff
	vshr.u64	q3, q2, #7
	vshr.u64	q2, q2, #6
	vld1.8		{d8}, [r2]
	vld1.8		{d10}, [r2]
	add		r2, r2, #6
	vld1.8		{d12}, [r2]
	vld1.8		{d14}, [r2]
	add		r2, r2, #6
	vld1.8		{d16}, [r2]
	add		r2, r2, #4
	vld1.8		{d18}, [r2]
	vld1.8		{d20}, [r2]
	add		r2, r2, #6
	vld1.8		{d22}, [r2]
	add		r2, r2, #2
	vld1.8		{d24}, [r2]
	vld1.8		{d26}, [r2]
	vshr.u64	q5, q5, #26
	vshr.u64	q6, q6, #3
	vshr.u64	q7, q7, #29
	vshr.u64	q8, q8, #6
	vshr.u64	q10, q10, #25
	vshr.u64	q11, q11, #3
	vshr.u64	q12, q12, #12
	vshr.u64	q13, q13, #38
	vand		q4, q4, q2
	vand		q6, q6, q2
	vand		q8, q8, q2
	vand		q10, q10, q2
	vand		q2, q12, q2
	vand		q5, q5, q3
	vand		q7, q7, q3
	vand		q9, q9, q3
	vand		q11, q11, q3
	vand		q3, q13, q3
	add		r2, r3, #48
	vadd.i64	q12, q4, q1
	vadd.i64	q13, q10, q1
	vshr.s64	q12, q12, #26
	vshr.s64	q13, q13, #26
	vadd.i64	q5, q5, q12
	vshl.i64	q12, q12, #26
	vadd.i64	q14, q5, q0
	vadd.i64	q11, q11, q13
	vshl.i64	q13, q13, #26
	vadd.i64	q15, q11, q0
	vsub.i64	q4, q4, q12
	vshr.s64	q12, q14, #25
	vsub.i64	q10, q10, q13
	vshr.s64	q13, q15, #25
	vadd.i64	q6, q6, q12
	vshl.i64	q12, q12, #25
	vadd.i64	q14, q6, q1
	vadd.i64	q2, q2, q13
	vsub.i64	q5, q5, q12
	vshr.s64	q12, q14, #26
	vshl.i64	q13, q13, #25
	vadd.i64	q14, q2, q1
	vadd.i64	q7, q7, q12
	vshl.i64	q12, q12, #26
	vadd.i64	q15, q7, q0
	vsub.i64	q11, q11, q13
	vshr.s64	q13, q14, #26
	vsub.i64	q6, q6, q12
	vshr.s64	q12, q15, #25
	vadd.i64	q3, q3, q13
	vshl.i64	q13, q13, #26
	vadd.i64	q14, q3, q0
	vadd.i64	q8, q8, q12
	vshl.i64	q12, q12, #25
	vadd.i64	q15, q8, q1
	add		r2, r2, #8
	vsub.i64	q2, q2, q13
	vshr.s64	q13, q14, #25
	vsub.i64	q7, q7, q12
	vshr.s64	q12, q15, #26
	vadd.i64	q14, q13, q13
	vadd.i64	q9, q9, q12
	vtrn.32		d12, d14
	vshl.i64	q12, q12, #26
	vtrn.32		d13, d15
	vadd.i64	q0, q9, q0
	vadd.i64	q4, q4, q14
	vst1.8		d12, [r2, : 64]!
	vshl.i64	q6, q13, #4
	vsub.i64	q7, q8, q12
	vshr.s64	q0, q0, #25
	vadd.i64	q4, q4, q6
	vadd.i64	q6, q10, q0
	vshl.i64	q0, q0, #25
	vadd.i64	q8, q6, q1
	vadd.i64	q4, q4, q13
	vshl.i64	q10, q13, #25
	vadd.i64	q1, q4, q1
	vsub.i64	q0, q9, q0
	vshr.s64	q8, q8, #26
	vsub.i64	q3, q3, q10
	vtrn.32		d14, d0
	vshr.s64	q1, q1, #26
	vtrn.32		d15, d1
	vadd.i64	q0, q11, q8
	vst1.8		d14, [r2, : 64]
	vshl.i64	q7, q8, #26
	vadd.i64	q5, q5, q1
	vtrn.32		d4, d6
	vshl.i64	q1, q1, #26
	vtrn.32		d5, d7
	vsub.i64	q3, q6, q7
	add		r2, r2, #16
	vsub.i64	q1, q4, q1
	vst1.8		d4, [r2, : 64]
	vtrn.32		d6, d0
	vtrn.32		d7, d1
	sub		r2, r2, #8
	vtrn.32		d2, d10
	vtrn.32		d3, d11
	vst1.8		d6, [r2, : 64]
	sub		r2, r2, #24
	vst1.8		d2, [r2, : 64]
	add		r2, r3, #96
	vmov.i32	q0, #0
	vmov.i64	d2, #0xff
	vmov.i64	d3, #0
	vshr.u32	q1, q1, #7
	vst1.8		{d2-d3}, [r2, : 128]!
	vst1.8		{d0-d1}, [r2, : 128]!
	vst1.8		d0, [r2, : 64]
	add		r2, r3, #144
	vmov.i32	q0, #0
	vst1.8		{d0-d1}, [r2, : 128]!
	vst1.8		{d0-d1}, [r2, : 128]!
	vst1.8		d0, [r2, : 64]
	add		r2, r3, #240
	vmov.i32	q0, #0
	vmov.i64	d2, #0xff
	vmov.i64	d3, #0
	vshr.u32	q1, q1, #7
	vst1.8		{d2-d3}, [r2, : 128]!
	vst1.8		{d0-d1}, [r2, : 128]!
	vst1.8		d0, [r2, : 64]
	add		r2, r3, #48
	add		r6, r3, #192
	vld1.8		{d0-d1}, [r2, : 128]!
	vld1.8		{d2-d3}, [r2, : 128]!
	vld1.8		{d4}, [r2, : 64]
	vst1.8		{d0-d1}, [r6, : 128]!
	vst1.8		{d2-d3}, [r6, : 128]!
	vst1.8		d4, [r6, : 64]
.Lmainloop:
	mov		r2, r5, LSR #3
	and		r6, r5, #7
	ldrb		r2, [r1, r2]
	mov		r2, r2, LSR r6
	and		r2, r2, #1
	str		r5, [sp, #456]
	eor		r4, r4, r2
	str		r2, [sp, #460]
	neg		r2, r4
	add		r4, r3, #96
	add		r5, r3, #192
	add		r6, r3, #144
	vld1.8		{d8-d9}, [r4, : 128]!
	add		r7, r3, #240
	vld1.8		{d10-d11}, [r5, : 128]!
	veor		q6, q4, q5
	vld1.8		{d14-d15}, [r6, : 128]!
	vdup.i32	q8, r2
	vld1.8		{d18-d19}, [r7, : 128]!
	veor		q10, q7, q9
	vld1.8		{d22-d23}, [r4, : 128]!
	vand		q6, q6, q8
	vld1.8		{d24-d25}, [r5, : 128]!
	vand		q10, q10, q8
	vld1.8		{d26-d27}, [r6, : 128]!
	veor		q4, q4, q6
	vld1.8		{d28-d29}, [r7, : 128]!
	veor		q5, q5, q6
	vld1.8		{d0}, [r4, : 64]
	veor		q6, q7, q10
	vld1.8		{d2}, [r5, : 64]
	veor		q7, q9, q10
	vld1.8		{d4}, [r6, : 64]
	veor		q9, q11, q12
	vld1.8		{d6}, [r7, : 64]
	veor		q10, q0, q1
	sub		r2, r4, #32
	vand		q9, q9, q8
	sub		r4, r5, #32
	vand		q10, q10, q8
	sub		r5, r6, #32
	veor		q11, q11, q9
	sub		r6, r7, #32
	veor		q0, q0, q10
	veor		q9, q12, q9
	veor		q1, q1, q10
	veor		q10, q13, q14
	veor		q12, q2, q3
	vand		q10, q10, q8
	vand		q8, q12, q8
	veor		q12, q13, q10
	veor		q2, q2, q8
	veor		q10, q14, q10
	veor		q3, q3, q8
	vadd.i32	q8, q4, q6
	vsub.i32	q4, q4, q6
	vst1.8		{d16-d17}, [r2, : 128]!
	vadd.i32	q6, q11, q12
	vst1.8		{d8-d9}, [r5, : 128]!
	vsub.i32	q4, q11, q12
	vst1.8		{d12-d13}, [r2, : 128]!
	vadd.i32	q6, q0, q2
	vst1.8		{d8-d9}, [r5, : 128]!
	vsub.i32	q0, q0, q2
	vst1.8		d12, [r2, : 64]
	vadd.i32	q2, q5, q7
	vst1.8		d0, [r5, : 64]
	vsub.i32	q0, q5, q7
	vst1.8		{d4-d5}, [r4, : 128]!
	vadd.i32	q2, q9, q10
	vst1.8		{d0-d1}, [r6, : 128]!
	vsub.i32	q0, q9, q10
	vst1.8		{d4-d5}, [r4, : 128]!
	vadd.i32	q2, q1, q3
	vst1.8		{d0-d1}, [r6, : 128]!
	vsub.i32	q0, q1, q3
	vst1.8		d4, [r4, : 64]
	vst1.8		d0, [r6, : 64]
	add		r2, sp, #512
	add		r4, r3, #96
	add		r5, r3, #144
	vld1.8		{d0-d1}, [r2, : 128]
	vld1.8		{d2-d3}, [r4, : 128]!
	vld1.8		{d4-d5}, [r5, : 128]!
	vzip.i32	q1, q2
	vld1.8		{d6-d7}, [r4, : 128]!
	vld1.8		{d8-d9}, [r5, : 128]!
	vshl.i32	q5, q1, #1
	vzip.i32	q3, q4
	vshl.i32	q6, q2, #1
	vld1.8		{d14}, [r4, : 64]
	vshl.i32	q8, q3, #1
	vld1.8		{d15}, [r5, : 64]
	vshl.i32	q9, q4, #1
	vmul.i32	d21, d7, d1
	vtrn.32		d14, d15
	vmul.i32	q11, q4, q0
	vmul.i32	q0, q7, q0
	vmull.s32	q12, d2, d2
	vmlal.s32	q12, d11, d1
	vmlal.s32	q12, d12, d0
	vmlal.s32	q12, d13, d23
	vmlal.s32	q12, d16, d22
	vmlal.s32	q12, d7, d21
	vmull.s32	q10, d2, d11
	vmlal.s32	q10, d4, d1
	vmlal.s32	q10, d13, d0
	vmlal.s32	q10, d6, d23
	vmlal.s32	q10, d17, d22
	vmull.s32	q13, d10, d4
	vmlal.s32	q13, d11, d3
	vmlal.s32	q13, d13, d1
	vmlal.s32	q13, d16, d0
	vmlal.s32	q13, d17, d23
	vmlal.s32	q13, d8, d22
	vmull.s32	q1, d10, d5
	vmlal.s32	q1, d11, d4
	vmlal.s32	q1, d6, d1
	vmlal.s32	q1, d17, d0
	vmlal.s32	q1, d8, d23
	vmull.s32	q14, d10, d6
	vmlal.s32	q14, d11, d13
	vmlal.s32	q14, d4, d4
	vmlal.s32	q14, d17, d1
	vmlal.s32	q14, d18, d0
	vmlal.s32	q14, d9, d23
	vmull.s32	q11, d10, d7
	vmlal.s32	q11, d11, d6
	vmlal.s32	q11, d12, d5
	vmlal.s32	q11, d8, d1
	vmlal.s32	q11, d19, d0
	vmull.s32	q15, d10, d8
	vmlal.s32	q15, d11, d17
	vmlal.s32	q15, d12, d6
	vmlal.s32	q15, d13, d5
	vmlal.s32	q15, d19, d1
	vmlal.s32	q15, d14, d0
	vmull.s32	q2, d10, d9
	vmlal.s32	q2, d11, d8
	vmlal.s32	q2, d12, d7
	vmlal.s32	q2, d13, d6
	vmlal.s32	q2, d14, d1
	vmull.s32	q0, d15, d1
	vmlal.s32	q0, d10, d14
	vmlal.s32	q0, d11, d19
	vmlal.s32	q0, d12, d8
	vmlal.s32	q0, d13, d17
	vmlal.s32	q0, d6, d6
	add		r2, sp, #480
	vld1.8		{d18-d19}, [r2, : 128]!
	vmull.s32	q3, d16, d7
	vmlal.s32	q3, d10, d15
	vmlal.s32	q3, d11, d14
	vmlal.s32	q3, d12, d9
	vmlal.s32	q3, d13, d8
	vld1.8		{d8-d9}, [r2, : 128]
	vadd.i64	q5, q12, q9
	vadd.i64	q6, q15, q9
	vshr.s64	q5, q5, #26
	vshr.s64	q6, q6, #26
	vadd.i64	q7, q10, q5
	vshl.i64	q5, q5, #26
	vadd.i64	q8, q7, q4
	vadd.i64	q2, q2, q6
	vshl.i64	q6, q6, #26
	vadd.i64	q10, q2, q4
	vsub.i64	q5, q12, q5
	vshr.s64	q8, q8, #25
	vsub.i64	q6, q15, q6
	vshr.s64	q10, q10, #25
	vadd.i64	q12, q13, q8
	vshl.i64	q8, q8, #25
	vadd.i64	q13, q12, q9
	vadd.i64	q0, q0, q10
	vsub.i64	q7, q7, q8
	vshr.s64	q8, q13, #26
	vshl.i64	q10, q10, #25
	vadd.i64	q13, q0, q9
	vadd.i64	q1, q1, q8
	vshl.i64	q8, q8, #26
	vadd.i64	q15, q1, q4
	vsub.i64	q2, q2, q10
	vshr.s64	q10, q13, #26
	vsub.i64	q8, q12, q8
	vshr.s64	q12, q15, #25
	vadd.i64	q3, q3, q10
	vshl.i64	q10, q10, #26
	vadd.i64	q13, q3, q4
	vadd.i64	q14, q14, q12
	add		r2, r3, #288
	vshl.i64	q12, q12, #25
	add		r4, r3, #336
	vadd.i64	q15, q14, q9
	add		r2, r2, #8
	vsub.i64	q0, q0, q10
	add		r4, r4, #8
	vshr.s64	q10, q13, #25
	vsub.i64	q1, q1, q12
	vshr.s64	q12, q15, #26
	vadd.i64	q13, q10, q10
	vadd.i64	q11, q11, q12
	vtrn.32		d16, d2
	vshl.i64	q12, q12, #26
	vtrn.32		d17, d3
	vadd.i64	q1, q11, q4
	vadd.i64	q4, q5, q13
	vst1.8		d16, [r2, : 64]!
	vshl.i64	q5, q10, #4
	vst1.8		d17, [r4, : 64]!
	vsub.i64	q8, q14, q12
	vshr.s64	q1, q1, #25
	vadd.i64	q4, q4, q5
	vadd.i64	q5, q6, q1
	vshl.i64	q1, q1, #25
	vadd.i64	q6, q5, q9
	vadd.i64	q4, q4, q10
	vshl.i64	q10, q10, #25
	vadd.i64	q9, q4, q9
	vsub.i64	q1, q11, q1
	vshr.s64	q6, q6, #26
	vsub.i64	q3, q3, q10
	vtrn.32		d16, d2
	vshr.s64	q9, q9, #26
	vtrn.32		d17, d3
	vadd.i64	q1, q2, q6
	vst1.8		d16, [r2, : 64]
	vshl.i64	q2, q6, #26
	vst1.8		d17, [r4, : 64]
	vadd.i64	q6, q7, q9
	vtrn.32		d0, d6
	vshl.i64	q7, q9, #26
	vtrn.32		d1, d7
	vsub.i64	q2, q5, q2
	add		r2, r2, #16
	vsub.i64	q3, q4, q7
	vst1.8		d0, [r2, : 64]
	add		r4, r4, #16
	vst1.8		d1, [r4, : 64]
	vtrn.32		d4, d2
	vtrn.32		d5, d3
	sub		r2, r2, #8
	sub		r4, r4, #8
	vtrn.32		d6, d12
	vtrn.32		d7, d13
	vst1.8		d4, [r2, : 64]
	vst1.8		d5, [r4, : 64]
	sub		r2, r2, #24
	sub		r4, r4, #24
	vst1.8		d6, [r2, : 64]
	vst1.8		d7, [r4, : 64]
	add		r2, r3, #240
	add		r4, r3, #96
	vld1.8		{d0-d1}, [r4, : 128]!
	vld1.8		{d2-d3}, [r4, : 128]!
	vld1.8		{d4}, [r4, : 64]
	add		r4, r3, #144
	vld1.8		{d6-d7}, [r4, : 128]!
	vtrn.32		q0, q3
	vld1.8		{d8-d9}, [r4, : 128]!
	vshl.i32	q5, q0, #4
	vtrn.32		q1, q4
	vshl.i32	q6, q3, #4
	vadd.i32	q5, q5, q0
	vadd.i32	q6, q6, q3
	vshl.i32	q7, q1, #4
	vld1.8		{d5}, [r4, : 64]
	vshl.i32	q8, q4, #4
	vtrn.32		d4, d5
	vadd.i32	q7, q7, q1
	vadd.i32	q8, q8, q4
	vld1.8		{d18-d19}, [r2, : 128]!
	vshl.i32	q10, q2, #4
	vld1.8		{d22-d23}, [r2, : 128]!
	vadd.i32	q10, q10, q2
	vld1.8		{d24}, [r2, : 64]
	vadd.i32	q5, q5, q0
	add		r2, r3, #192
	vld1.8		{d26-d27}, [r2, : 128]!
	vadd.i32	q6, q6, q3
	vld1.8		{d28-d29}, [r2, : 128]!
	vadd.i32	q8, q8, q4
	vld1.8		{d25}, [r2, : 64]
	vadd.i32	q10, q10, q2
	vtrn.32		q9, q13
	vadd.i32	q7, q7, q1
	vadd.i32	q5, q5, q0
	vtrn.32		q11, q14
	vadd.i32	q6, q6, q3
	add		r2, sp, #528
	vadd.i32	q10, q10, q2
	vtrn.32		d24, d25
	vst1.8		{d12-d13}, [r2, : 128]!
	vshl.i32	q6, q13, #1
	vst1.8		{d20-d21}, [r2, : 128]!
	vshl.i32	q10, q14, #1
	vst1.8		{d12-d13}, [r2, : 128]!
	vshl.i32	q15, q12, #1
	vadd.i32	q8, q8, q4
	vext.32		d10, d31, d30, #0
	vadd.i32	q7, q7, q1
	vst1.8		{d16-d17}, [r2, : 128]!
	vmull.s32	q8, d18, d5
	vmlal.s32	q8, d26, d4
	vmlal.s32	q8, d19, d9
	vmlal.s32	q8, d27, d3
	vmlal.s32	q8, d22, d8
	vmlal.s32	q8, d28, d2
	vmlal.s32	q8, d23, d7
	vmlal.s32	q8, d29, d1
	vmlal.s32	q8, d24, d6
	vmlal.s32	q8, d25, d0
	vst1.8		{d14-d15}, [r2, : 128]!
	vmull.s32	q2, d18, d4
	vmlal.s32	q2, d12, d9
	vmlal.s32	q2, d13, d8
	vmlal.s32	q2, d19, d3
	vmlal.s32	q2, d22, d2
	vmlal.s32	q2, d23, d1
	vmlal.s32	q2, d24, d0
	vst1.8		{d20-d21}, [r2, : 128]!
	vmull.s32	q7, d18, d9
	vmlal.s32	q7, d26, d3
	vmlal.s32	q7, d19, d8
	vmlal.s32	q7, d27, d2
	vmlal.s32	q7, d22, d7
	vmlal.s32	q7, d28, d1
	vmlal.s32	q7, d23, d6
	vmlal.s32	q7, d29, d0
	vst1.8		{d10-d11}, [r2, : 128]!
	vmull.s32	q5, d18, d3
	vmlal.s32	q5, d19, d2
	vmlal.s32	q5, d22, d1
	vmlal.s32	q5, d23, d0
	vmlal.s32	q5, d12, d8
	vst1.8		{d16-d17}, [r2, : 128]
	vmull.s32	q4, d18, d8
	vmlal.s32	q4, d26, d2
	vmlal.s32	q4, d19, d7
	vmlal.s32	q4, d27, d1
	vmlal.s32	q4, d22, d6
	vmlal.s32	q4, d28, d0
	vmull.s32	q8, d18, d7
	vmlal.s32	q8, d26, d1
	vmlal.s32	q8, d19, d6
	vmlal.s32	q8, d27, d0
	add		r2, sp, #544
	vld1.8		{d20-d21}, [r2, : 128]
	vmlal.s32	q7, d24, d21
	vmlal.s32	q7, d25, d20
	vmlal.s32	q4, d23, d21
	vmlal.s32	q4, d29, d20
	vmlal.s32	q8, d22, d21
	vmlal.s32	q8, d28, d20
	vmlal.s32	q5, d24, d20
	vst1.8		{d14-d15}, [r2, : 128]
	vmull.s32	q7, d18, d6
	vmlal.s32	q7, d26, d0
	add		r2, sp, #624
	vld1.8		{d30-d31}, [r2, : 128]
	vmlal.s32	q2, d30, d21
	vmlal.s32	q7, d19, d21
	vmlal.s32	q7, d27, d20
	add		r2, sp, #592
	vld1.8		{d26-d27}, [r2, : 128]
	vmlal.s32	q4, d25, d27
	vmlal.s32	q8, d29, d27
	vmlal.s32	q8, d25, d26
	vmlal.s32	q7, d28, d27
	vmlal.s32	q7, d29, d26
	add		r2, sp, #576
	vld1.8		{d28-d29}, [r2, : 128]
	vmlal.s32	q4, d24, d29
	vmlal.s32	q8, d23, d29
	vmlal.s32	q8, d24, d28
	vmlal.s32	q7, d22, d29
	vmlal.s32	q7, d23, d28
	vst1.8		{d8-d9}, [r2, : 128]
	add		r2, sp, #528
	vld1.8		{d8-d9}, [r2, : 128]
	vmlal.s32	q7, d24, d9
	vmlal.s32	q7, d25, d31
	vmull.s32	q1, d18, d2
	vmlal.s32	q1, d19, d1
	vmlal.s32	q1, d22, d0
	vmlal.s32	q1, d24, d27
	vmlal.s32	q1, d23, d20
	vmlal.s32	q1, d12, d7
	vmlal.s32	q1, d13, d6
	vmull.s32	q6, d18, d1
	vmlal.s32	q6, d19, d0
	vmlal.s32	q6, d23, d27
	vmlal.s32	q6, d22, d20
	vmlal.s32	q6, d24, d26
	vmull.s32	q0, d18, d0
	vmlal.s32	q0, d22, d27
	vmlal.s32	q0, d23, d26
	vmlal.s32	q0, d24, d31
	vmlal.s32	q0, d19, d20
	add		r2, sp, #608
	vld1.8		{d18-d19}, [r2, : 128]
	vmlal.s32	q2, d18, d7
	vmlal.s32	q5, d18, d6
	vmlal.s32	q1, d18, d21
	vmlal.s32	q0, d18, d28
	vmlal.s32	q6, d18, d29
	vmlal.s32	q2, d19, d6
	vmlal.s32	q5, d19, d21
	vmlal.s32	q1, d19, d29
	vmlal.s32	q0, d19, d9
	vmlal.s32	q6, d19, d28
	add		r2, sp, #560
	vld1.8		{d18-d19}, [r2, : 128]
	add		r2, sp, #480
	vld1.8		{d22-d23}, [r2, : 128]
	vmlal.s32	q5, d19, d7
	vmlal.s32	q0, d18, d21
	vmlal.s32	q0, d19, d29
	vmlal.s32	q6, d18, d6
	add		r2, sp, #496
	vld1.8		{d6-d7}, [r2, : 128]
	vmlal.s32	q6, d19, d21
	add		r2, sp, #544
	vld1.8		{d18-d19}, [r2, : 128]
	vmlal.s32	q0, d30, d8
	add		r2, sp, #640
	vld1.8		{d20-d21}, [r2, : 128]
	vmlal.s32	q5, d30, d29
	add		r2, sp, #576
	vld1.8		{d24-d25}, [r2, : 128]
	vmlal.s32	q1, d30, d28
	vadd.i64	q13, q0, q11
	vadd.i64	q14, q5, q11
	vmlal.s32	q6, d30, d9
	vshr.s64	q4, q13, #26
	vshr.s64	q13, q14, #26
	vadd.i64	q7, q7, q4
	vshl.i64	q4, q4, #26
	vadd.i64	q14, q7, q3
	vadd.i64	q9, q9, q13
	vshl.i64	q13, q13, #26
	vadd.i64	q15, q9, q3
	vsub.i64	q0, q0, q4
	vshr.s64	q4, q14, #25
	vsub.i64	q5, q5, q13
	vshr.s64	q13, q15, #25
	vadd.i64	q6, q6, q4
	vshl.i64	q4, q4, #25
	vadd.i64	q14, q6, q11
	vadd.i64	q2, q2, q13
	vsub.i64	q4, q7, q4
	vshr.s64	q7, q14, #26
	vshl.i64	q13, q13, #25
	vadd.i64	q14, q2, q11
	vadd.i64	q8, q8, q7
	vshl.i64	q7, q7, #26
	vadd.i64	q15, q8, q3
	vsub.i64	q9, q9, q13
	vshr.s64	q13, q14, #26
	vsub.i64	q6, q6, q7
	vshr.s64	q7, q15, #25
	vadd.i64	q10, q10, q13
	vshl.i64	q13, q13, #26
	vadd.i64	q14, q10, q3
	vadd.i64	q1, q1, q7
	add		r2, r3, #144
	vshl.i64	q7, q7, #25
	add		r4, r3, #96
	vadd.i64	q15, q1, q11
	add		r2, r2, #8
	vsub.i64	q2, q2, q13
	add		r4, r4, #8
	vshr.s64	q13, q14, #25
	vsub.i64	q7, q8, q7
	vshr.s64	q8, q15, #26
	vadd.i64	q14, q13, q13
	vadd.i64	q12, q12, q8
	vtrn.32		d12, d14
	vshl.i64	q8, q8, #26
	vtrn.32		d13, d15
	vadd.i64	q3, q12, q3
	vadd.i64	q0, q0, q14
	vst1.8		d12, [r2, : 64]!
	vshl.i64	q7, q13, #4
	vst1.8		d13, [r4, : 64]!
	vsub.i64	q1, q1, q8
	vshr.s64	q3, q3, #25
	vadd.i64	q0, q0, q7
	vadd.i64	q5, q5, q3
	vshl.i64	q3, q3, #25
	vadd.i64	q6, q5, q11
	vadd.i64	q0, q0, q13
	vshl.i64	q7, q13, #25
	vadd.i64	q8, q0, q11
	vsub.i64	q3, q12, q3
	vshr.s64	q6, q6, #26
	vsub.i64	q7, q10, q7
	vtrn.32		d2, d6
	vshr.s64	q8, q8, #26
	vtrn.32		d3, d7
	vadd.i64	q3, q9, q6
	vst1.8		d2, [r2, : 64]
	vshl.i64	q6, q6, #26
	vst1.8		d3, [r4, : 64]
	vadd.i64	q1, q4, q8
	vtrn.32		d4, d14
	vshl.i64	q4, q8, #26
	vtrn.32		d5, d15
	vsub.i64	q5, q5, q6
	add		r2, r2, #16
	vsub.i64	q0, q0, q4
	vst1.8		d4, [r2, : 64]
	add		r4, r4, #16
	vst1.8		d5, [r4, : 64]
	vtrn.32		d10, d6
	vtrn.32		d11, d7
	sub		r2, r2, #8
	sub		r4, r4, #8
	vtrn.32		d0, d2
	vtrn.32		d1, d3
	vst1.8		d10, [r2, : 64]
	vst1.8		d11, [r4, : 64]
	sub		r2, r2, #24
	sub		r4, r4, #24
	vst1.8		d0, [r2, : 64]
	vst1.8		d1, [r4, : 64]
	add		r2, r3, #288
	add		r4, r3, #336
	vld1.8		{d0-d1}, [r2, : 128]!
	vld1.8		{d2-d3}, [r4, : 128]!
	vsub.i32	q0, q0, q1
	vld1.8		{d2-d3}, [r2, : 128]!
	vld1.8		{d4-d5}, [r4, : 128]!
	vsub.i32	q1, q1, q2
	add		r5, r3, #240
	vld1.8		{d4}, [r2, : 64]
	vld1.8		{d6}, [r4, : 64]
	vsub.i32	q2, q2, q3
	vst1.8		{d0-d1}, [r5, : 128]!
	vst1.8		{d2-d3}, [r5, : 128]!
	vst1.8		d4, [r5, : 64]
	add		r2, r3, #144
	add		r4, r3, #96
	add		r5, r3, #144
	add		r6, r3, #192
	vld1.8		{d0-d1}, [r2, : 128]!
	vld1.8		{d2-d3}, [r4, : 128]!
	vsub.i32	q2, q0, q1
	vadd.i32	q0, q0, q1
	vld1.8		{d2-d3}, [r2, : 128]!
	vld1.8		{d6-d7}, [r4, : 128]!
	vsub.i32	q4, q1, q3
	vadd.i32	q1, q1, q3
	vld1.8		{d6}, [r2, : 64]
	vld1.8		{d10}, [r4, : 64]
	vsub.i32	q6, q3, q5
	vadd.i32	q3, q3, q5
	vst1.8		{d4-d5}, [r5, : 128]!
	vst1.8		{d0-d1}, [r6, : 128]!
	vst1.8		{d8-d9}, [r5, : 128]!
	vst1.8		{d2-d3}, [r6, : 128]!
	vst1.8		d12, [r5, : 64]
	vst1.8		d6, [r6, : 64]
	add		r2, r3, #0
	add		r4, r3, #240
	vld1.8		{d0-d1}, [r4, : 128]!
	vld1.8		{d2-d3}, [r4, : 128]!
	vld1.8		{d4}, [r4, : 64]
	add		r4, r3, #336
	vld1.8		{d6-d7}, [r4, : 128]!
	vtrn.32		q0, q3
	vld1.8		{d8-d9}, [r4, : 128]!
	vshl.i32	q5, q0, #4
	vtrn.32		q1, q4
	vshl.i32	q6, q3, #4
	vadd.i32	q5, q5, q0
	vadd.i32	q6, q6, q3
	vshl.i32	q7, q1, #4
	vld1.8		{d5}, [r4, : 64]
	vshl.i32	q8, q4, #4
	vtrn.32		d4, d5
	vadd.i32	q7, q7, q1
	vadd.i32	q8, q8, q4
	vld1.8		{d18-d19}, [r2, : 128]!
	vshl.i32	q10, q2, #4
	vld1.8		{d22-d23}, [r2, : 128]!
	vadd.i32	q10, q10, q2
	vld1.8		{d24}, [r2, : 64]
	vadd.i32	q5, q5, q0
	add		r2, r3, #288
	vld1.8		{d26-d27}, [r2, : 128]!
	vadd.i32	q6, q6, q3
	vld1.8		{d28-d29}, [r2, : 128]!
	vadd.i32	q8, q8, q4
	vld1.8		{d25}, [r2, : 64]
	vadd.i32	q10, q10, q2
	vtrn.32		q9, q13
	vadd.i32	q7, q7, q1
	vadd.i32	q5, q5, q0
	vtrn.32		q11, q14
	vadd.i32	q6, q6, q3
	add		r2, sp, #528
	vadd.i32	q10, q10, q2
	vtrn.32		d24, d25
	vst1.8		{d12-d13}, [r2, : 128]!
	vshl.i32	q6, q13, #1
	vst1.8		{d20-d21}, [r2, : 128]!
	vshl.i32	q10, q14, #1
	vst1.8		{d12-d13}, [r2, : 128]!
	vshl.i32	q15, q12, #1
	vadd.i32	q8, q8, q4
	vext.32		d10, d31, d30, #0
	vadd.i32	q7, q7, q1
	vst1.8		{d16-d17}, [r2, : 128]!
	vmull.s32	q8, d18, d5
	vmlal.s32	q8, d26, d4
	vmlal.s32	q8, d19, d9
	vmlal.s32	q8, d27, d3
	vmlal.s32	q8, d22, d8
	vmlal.s32	q8, d28, d2
	vmlal.s32	q8, d23, d7
	vmlal.s32	q8, d29, d1
	vmlal.s32	q8, d24, d6
	vmlal.s32	q8, d25, d0
	vst1.8		{d14-d15}, [r2, : 128]!
	vmull.s32	q2, d18, d4
	vmlal.s32	q2, d12, d9
	vmlal.s32	q2, d13, d8
	vmlal.s32	q2, d19, d3
	vmlal.s32	q2, d22, d2
	vmlal.s32	q2, d23, d1
	vmlal.s32	q2, d24, d0
	vst1.8		{d20-d21}, [r2, : 128]!
	vmull.s32	q7, d18, d9
	vmlal.s32	q7, d26, d3
	vmlal.s32	q7, d19, d8
	vmlal.s32	q7, d27, d2
	vmlal.s32	q7, d22, d7
	vmlal.s32	q7, d28, d1
	vmlal.s32	q7, d23, d6
	vmlal.s32	q7, d29, d0
	vst1.8		{d10-d11}, [r2, : 128]!
	vmull.s32	q5, d18, d3
	vmlal.s32	q5, d19, d2
	vmlal.s32	q5, d22, d1
	vmlal.s32	q5, d23, d0
	vmlal.s32	q5, d12, d8
	vst1.8		{d16-d17}, [r2, : 128]!
	vmull.s32	q4, d18, d8
	vmlal.s32	q4, d26, d2
	vmlal.s32	q4, d19, d7
	vmlal.s32	q4, d27, d1
	vmlal.s32	q4, d22, d6
	vmlal.s32	q4, d28, d0
	vmull.s32	q8, d18, d7
	vmlal.s32	q8, d26, d1
	vmlal.s32	q8, d19, d6
	vmlal.s32	q8, d27, d0
	add		r2, sp, #544
	vld1.8		{d20-d21}, [r2, : 128]
	vmlal.s32	q7, d24, d21
	vmlal.s32	q7, d25, d20
	vmlal.s32	q4, d23, d21
	vmlal.s32	q4, d29, d20
	vmlal.s32	q8, d22, d21
	vmlal.s32	q8, d28, d20
	vmlal.s32	q5, d24, d20
	vst1.8		{d14-d15}, [r2, : 128]
	vmull.s32	q7, d18, d6
	vmlal.s32	q7, d26, d0
	add		r2, sp, #624
	vld1.8		{d30-d31}, [r2, : 128]
	vmlal.s32	q2, d30, d21
	vmlal.s32	q7, d19, d21
	vmlal.s32	q7, d27, d20
	add		r2, sp, #592
	vld1.8		{d26-d27}, [r2, : 128]
	vmlal.s32	q4, d25, d27
	vmlal.s32	q8, d29, d27
	vmlal.s32	q8, d25, d26
	vmlal.s32	q7, d28, d27
	vmlal.s32	q7, d29, d26
	add		r2, sp, #576
	vld1.8		{d28-d29}, [r2, : 128]
	vmlal.s32	q4, d24, d29
	vmlal.s32	q8, d23, d29
	vmlal.s32	q8, d24, d28
	vmlal.s32	q7, d22, d29
	vmlal.s32	q7, d23, d28
	vst1.8		{d8-d9}, [r2, : 128]
	add		r2, sp, #528
	vld1.8		{d8-d9}, [r2, : 128]
	vmlal.s32	q7, d24, d9
	vmlal.s32	q7, d25, d31
	vmull.s32	q1, d18, d2
	vmlal.s32	q1, d19, d1
	vmlal.s32	q1, d22, d0
	vmlal.s32	q1, d24, d27
	vmlal.s32	q1, d23, d20
	vmlal.s32	q1, d12, d7
	vmlal.s32	q1, d13, d6
	vmull.s32	q6, d18, d1
	vmlal.s32	q6, d19, d0
	vmlal.s32	q6, d23, d27
	vmlal.s32	q6, d22, d20
	vmlal.s32	q6, d24, d26
	vmull.s32	q0, d18, d0
	vmlal.s32	q0, d22, d27
	vmlal.s32	q0, d23, d26
	vmlal.s32	q0, d24, d31
	vmlal.s32	q0, d19, d20
	add		r2, sp, #608
	vld1.8		{d18-d19}, [r2, : 128]
	vmlal.s32	q2, d18, d7
	vmlal.s32	q5, d18, d6
	vmlal.s32	q1, d18, d21
	vmlal.s32	q0, d18, d28
	vmlal.s32	q6, d18, d29
	vmlal.s32	q2, d19, d6
	vmlal.s32	q5, d19, d21
	vmlal.s32	q1, d19, d29
	vmlal.s32	q0, d19, d9
	vmlal.s32	q6, d19, d28
	add		r2, sp, #560
	vld1.8		{d18-d19}, [r2, : 128]
	add		r2, sp, #480
	vld1.8		{d22-d23}, [r2, : 128]
	vmlal.s32	q5, d19, d7
	vmlal.s32	q0, d18, d21
	vmlal.s32	q0, d19, d29
	vmlal.s32	q6, d18, d6
	add		r2, sp, #496
	vld1.8		{d6-d7}, [r2, : 128]
	vmlal.s32	q6, d19, d21
	add		r2, sp, #544
	vld1.8		{d18-d19}, [r2, : 128]
	vmlal.s32	q0, d30, d8
	add		r2, sp, #640
	vld1.8		{d20-d21}, [r2, : 128]
	vmlal.s32	q5, d30, d29
	add		r2, sp, #576
	vld1.8		{d24-d25}, [r2, : 128]
	vmlal.s32	q1, d30, d28
	vadd.i64	q13, q0, q11
	vadd.i64	q14, q5, q11
	vmlal.s32	q6, d30, d9
	vshr.s64	q4, q13, #26
	vshr.s64	q13, q14, #26
	vadd.i64	q7, q7, q4
	vshl.i64	q4, q4, #26
	vadd.i64	q14, q7, q3
	vadd.i64	q9, q9, q13
	vshl.i64	q13, q13, #26
	vadd.i64	q15, q9, q3
	vsub.i64	q0, q0, q4
	vshr.s64	q4, q14, #25
	vsub.i64	q5, q5, q13
	vshr.s64	q13, q15, #25
	vadd.i64	q6, q6, q4
	vshl.i64	q4, q4, #25
	vadd.i64	q14, q6, q11
	vadd.i64	q2, q2, q13
	vsub.i64	q4, q7, q4
	vshr.s64	q7, q14, #26
	vshl.i64	q13, q13, #25
	vadd.i64	q14, q2, q11
	vadd.i64	q8, q8, q7
	vshl.i64	q7, q7, #26
	vadd.i64	q15, q8, q3
	vsub.i64	q9, q9, q13
	vshr.s64	q13, q14, #26
	vsub.i64	q6, q6, q7
	vshr.s64	q7, q15, #25
	vadd.i64	q10, q10, q13
	vshl.i64	q13, q13, #26
	vadd.i64	q14, q10, q3
	vadd.i64	q1, q1, q7
	add		r2, r3, #288
	vshl.i64	q7, q7, #25
	add		r4, r3, #96
	vadd.i64	q15, q1, q11
	add		r2, r2, #8
	vsub.i64	q2, q2, q13
	add		r4, r4, #8
	vshr.s64	q13, q14, #25
	vsub.i64	q7, q8, q7
	vshr.s64	q8, q15, #26
	vadd.i64	q14, q13, q13
	vadd.i64	q12, q12, q8
	vtrn.32		d12, d14
	vshl.i64	q8, q8, #26
	vtrn.32		d13, d15
	vadd.i64	q3, q12, q3
	vadd.i64	q0, q0, q14
	vst1.8		d12, [r2, : 64]!
	vshl.i64	q7, q13, #4
	vst1.8		d13, [r4, : 64]!
	vsub.i64	q1, q1, q8
	vshr.s64	q3, q3, #25
	vadd.i64	q0, q0, q7
	vadd.i64	q5, q5, q3
	vshl.i64	q3, q3, #25
	vadd.i64	q6, q5, q11
	vadd.i64	q0, q0, q13
	vshl.i64	q7, q13, #25
	vadd.i64	q8, q0, q11
	vsub.i64	q3, q12, q3
	vshr.s64	q6, q6, #26
	vsub.i64	q7, q10, q7
	vtrn.32		d2, d6
	vshr.s64	q8, q8, #26
	vtrn.32		d3, d7
	vadd.i64	q3, q9, q6
	vst1.8		d2, [r2, : 64]
	vshl.i64	q6, q6, #26
	vst1.8		d3, [r4, : 64]
	vadd.i64	q1, q4, q8
	vtrn.32		d4, d14
	vshl.i64	q4, q8, #26
	vtrn.32		d5, d15
	vsub.i64	q5, q5, q6
	add		r2, r2, #16
	vsub.i64	q0, q0, q4
	vst1.8		d4, [r2, : 64]
	add		r4, r4, #16
	vst1.8		d5, [r4, : 64]
	vtrn.32		d10, d6
	vtrn.32		d11, d7
	sub		r2, r2, #8
	sub		r4, r4, #8
	vtrn.32		d0, d2
	vtrn.32		d1, d3
	vst1.8		d10, [r2, : 64]
	vst1.8		d11, [r4, : 64]
	sub		r2, r2, #24
	sub		r4, r4, #24
	vst1.8		d0, [r2, : 64]
	vst1.8		d1, [r4, : 64]
	add		r2, sp, #512
	add		r4, r3, #144
	add		r5, r3, #192
	vld1.8		{d0-d1}, [r2, : 128]
	vld1.8		{d2-d3}, [r4, : 128]!
	vld1.8		{d4-d5}, [r5, : 128]!
	vzip.i32	q1, q2
	vld1.8		{d6-d7}, [r4, : 128]!
	vld1.8		{d8-d9}, [r5, : 128]!
	vshl.i32	q5, q1, #1
	vzip.i32	q3, q4
	vshl.i32	q6, q2, #1
	vld1.8		{d14}, [r4, : 64]
	vshl.i32	q8, q3, #1
	vld1.8		{d15}, [r5, : 64]
	vshl.i32	q9, q4, #1
	vmul.i32	d21, d7, d1
	vtrn.32		d14, d15
	vmul.i32	q11, q4, q0
	vmul.i32	q0, q7, q0
	vmull.s32	q12, d2, d2
	vmlal.s32	q12, d11, d1
	vmlal.s32	q12, d12, d0
	vmlal.s32	q12, d13, d23
	vmlal.s32	q12, d16, d22
	vmlal.s32	q12, d7, d21
	vmull.s32	q10, d2, d11
	vmlal.s32	q10, d4, d1
	vmlal.s32	q10, d13, d0
	vmlal.s32	q10, d6, d23
	vmlal.s32	q10, d17, d22
	vmull.s32	q13, d10, d4
	vmlal.s32	q13, d11, d3
	vmlal.s32	q13, d13, d1
	vmlal.s32	q13, d16, d0
	vmlal.s32	q13, d17, d23
	vmlal.s32	q13, d8, d22
	vmull.s32	q1, d10, d5
	vmlal.s32	q1, d11, d4
	vmlal.s32	q1, d6, d1
	vmlal.s32	q1, d17, d0
	vmlal.s32	q1, d8, d23
	vmull.s32	q14, d10, d6
	vmlal.s32	q14, d11, d13
	vmlal.s32	q14, d4, d4
	vmlal.s32	q14, d17, d1
	vmlal.s32	q14, d18, d0
	vmlal.s32	q14, d9, d23
	vmull.s32	q11, d10, d7
	vmlal.s32	q11, d11, d6
	vmlal.s32	q11, d12, d5
	vmlal.s32	q11, d8, d1
	vmlal.s32	q11, d19, d0
	vmull.s32	q15, d10, d8
	vmlal.s32	q15, d11, d17
	vmlal.s32	q15, d12, d6
	vmlal.s32	q15, d13, d5
	vmlal.s32	q15, d19, d1
	vmlal.s32	q15, d14, d0
	vmull.s32	q2, d10, d9
	vmlal.s32	q2, d11, d8
	vmlal.s32	q2, d12, d7
	vmlal.s32	q2, d13, d6
	vmlal.s32	q2, d14, d1
	vmull.s32	q0, d15, d1
	vmlal.s32	q0, d10, d14
	vmlal.s32	q0, d11, d19
	vmlal.s32	q0, d12, d8
	vmlal.s32	q0, d13, d17
	vmlal.s32	q0, d6, d6
	add		r2, sp, #480
	vld1.8		{d18-d19}, [r2, : 128]!
	vmull.s32	q3, d16, d7
	vmlal.s32	q3, d10, d15
	vmlal.s32	q3, d11, d14
	vmlal.s32	q3, d12, d9
	vmlal.s32	q3, d13, d8
	vld1.8		{d8-d9}, [r2, : 128]
	vadd.i64	q5, q12, q9
	vadd.i64	q6, q15, q9
	vshr.s64	q5, q5, #26
	vshr.s64	q6, q6, #26
	vadd.i64	q7, q10, q5
	vshl.i64	q5, q5, #26
	vadd.i64	q8, q7, q4
	vadd.i64	q2, q2, q6
	vshl.i64	q6, q6, #26
	vadd.i64	q10, q2, q4
	vsub.i64	q5, q12, q5
	vshr.s64	q8, q8, #25
	vsub.i64	q6, q15, q6
	vshr.s64	q10, q10, #25
	vadd.i64	q12, q13, q8
	vshl.i64	q8, q8, #25
	vadd.i64	q13, q12, q9
	vadd.i64	q0, q0, q10
	vsub.i64	q7, q7, q8
	vshr.s64	q8, q13, #26
	vshl.i64	q10, q10, #25
	vadd.i64	q13, q0, q9
	vadd.i64	q1, q1, q8
	vshl.i64	q8, q8, #26
	vadd.i64	q15, q1, q4
	vsub.i64	q2, q2, q10
	vshr.s64	q10, q13, #26
	vsub.i64	q8, q12, q8
	vshr.s64	q12, q15, #25
	vadd.i64	q3, q3, q10
	vshl.i64	q10, q10, #26
	vadd.i64	q13, q3, q4
	vadd.i64	q14, q14, q12
	add		r2, r3, #144
	vshl.i64	q12, q12, #25
	add		r4, r3, #192
	vadd.i64	q15, q14, q9
	add		r2, r2, #8
	vsub.i64	q0, q0, q10
	add		r4, r4, #8
	vshr.s64	q10, q13, #25
	vsub.i64	q1, q1, q12
	vshr.s64	q12, q15, #26
	vadd.i64	q13, q10, q10
	vadd.i64	q11, q11, q12
	vtrn.32		d16, d2
	vshl.i64	q12, q12, #26
	vtrn.32		d17, d3
	vadd.i64	q1, q11, q4
	vadd.i64	q4, q5, q13
	vst1.8		d16, [r2, : 64]!
	vshl.i64	q5, q10, #4
	vst1.8		d17, [r4, : 64]!
	vsub.i64	q8, q14, q12
	vshr.s64	q1, q1, #25
	vadd.i64	q4, q4, q5
	vadd.i64	q5, q6, q1
	vshl.i64	q1, q1, #25
	vadd.i64	q6, q5, q9
	vadd.i64	q4, q4, q10
	vshl.i64	q10, q10, #25
	vadd.i64	q9, q4, q9
	vsub.i64	q1, q11, q1
	vshr.s64	q6, q6, #26
	vsub.i64	q3, q3, q10
	vtrn.32		d16, d2
	vshr.s64	q9, q9, #26
	vtrn.32		d17, d3
	vadd.i64	q1, q2, q6
	vst1.8		d16, [r2, : 64]
	vshl.i64	q2, q6, #26
	vst1.8		d17, [r4, : 64]
	vadd.i64	q6, q7, q9
	vtrn.32		d0, d6
	vshl.i64	q7, q9, #26
	vtrn.32		d1, d7
	vsub.i64	q2, q5, q2
	add		r2, r2, #16
	vsub.i64	q3, q4, q7
	vst1.8		d0, [r2, : 64]
	add		r4, r4, #16
	vst1.8		d1, [r4, : 64]
	vtrn.32		d4, d2
	vtrn.32		d5, d3
	sub		r2, r2, #8
	sub		r4, r4, #8
	vtrn.32		d6, d12
	vtrn.32		d7, d13
	vst1.8		d4, [r2, : 64]
	vst1.8		d5, [r4, : 64]
	sub		r2, r2, #24
	sub		r4, r4, #24
	vst1.8		d6, [r2, : 64]
	vst1.8		d7, [r4, : 64]
	add		r2, r3, #336
	add		r4, r3, #288
	vld1.8		{d0-d1}, [r2, : 128]!
	vld1.8		{d2-d3}, [r4, : 128]!
	vadd.i32	q0, q0, q1
	vld1.8		{d2-d3}, [r2, : 128]!
	vld1.8		{d4-d5}, [r4, : 128]!
	vadd.i32	q1, q1, q2
	add		r5, r3, #288
	vld1.8		{d4}, [r2, : 64]
	vld1.8		{d6}, [r4, : 64]
	vadd.i32	q2, q2, q3
	vst1.8		{d0-d1}, [r5, : 128]!
	vst1.8		{d2-d3}, [r5, : 128]!
	vst1.8		d4, [r5, : 64]
	add		r2, r3, #48
	add		r4, r3, #144
	vld1.8		{d0-d1}, [r4, : 128]!
	vld1.8		{d2-d3}, [r4, : 128]!
	vld1.8		{d4}, [r4, : 64]
	add		r4, r3, #288
	vld1.8		{d6-d7}, [r4, : 128]!
	vtrn.32		q0, q3
	vld1.8		{d8-d9}, [r4, : 128]!
	vshl.i32	q5, q0, #4
	vtrn.32		q1, q4
	vshl.i32	q6, q3, #4
	vadd.i32	q5, q5, q0
	vadd.i32	q6, q6, q3
	vshl.i32	q7, q1, #4
	vld1.8		{d5}, [r4, : 64]
	vshl.i32	q8, q4, #4
	vtrn.32		d4, d5
	vadd.i32	q7, q7, q1
	vadd.i32	q8, q8, q4
	vld1.8		{d18-d19}, [r2, : 128]!
	vshl.i32	q10, q2, #4
	vld1.8		{d22-d23}, [r2, : 128]!
	vadd.i32	q10, q10, q2
	vld1.8		{d24}, [r2, : 64]
	vadd.i32	q5, q5, q0
	add		r2, r3, #240
	vld1.8		{d26-d27}, [r2, : 128]!
	vadd.i32	q6, q6, q3
	vld1.8		{d28-d29}, [r2, : 128]!
	vadd.i32	q8, q8, q4
	vld1.8		{d25}, [r2, : 64]
	vadd.i32	q10, q10, q2
	vtrn.32		q9, q13
	vadd.i32	q7, q7, q1
	vadd.i32	q5, q5, q0
	vtrn.32		q11, q14
	vadd.i32	q6, q6, q3
	add		r2, sp, #528
	vadd.i32	q10, q10, q2
	vtrn.32		d24, d25
	vst1.8		{d12-d13}, [r2, : 128]!
	vshl.i32	q6, q13, #1
	vst1.8		{d20-d21}, [r2, : 128]!
	vshl.i32	q10, q14, #1
	vst1.8		{d12-d13}, [r2, : 128]!
	vshl.i32	q15, q12, #1
	vadd.i32	q8, q8, q4
	vext.32		d10, d31, d30, #0
	vadd.i32	q7, q7, q1
	vst1.8		{d16-d17}, [r2, : 128]!
	vmull.s32	q8, d18, d5
	vmlal.s32	q8, d26, d4
	vmlal.s32	q8, d19, d9
	vmlal.s32	q8, d27, d3
	vmlal.s32	q8, d22, d8
	vmlal.s32	q8, d28, d2
	vmlal.s32	q8, d23, d7
	vmlal.s32	q8, d29, d1
	vmlal.s32	q8, d24, d6
	vmlal.s32	q8, d25, d0
	vst1.8		{d14-d15}, [r2, : 128]!
	vmull.s32	q2, d18, d4
	vmlal.s32	q2, d12, d9
	vmlal.s32	q2, d13, d8
	vmlal.s32	q2, d19, d3
	vmlal.s32	q2, d22, d2
	vmlal.s32	q2, d23, d1
	vmlal.s32	q2, d24, d0
	vst1.8		{d20-d21}, [r2, : 128]!
	vmull.s32	q7, d18, d9
	vmlal.s32	q7, d26, d3
	vmlal.s32	q7, d19, d8
	vmlal.s32	q7, d27, d2
	vmlal.s32	q7, d22, d7
	vmlal.s32	q7, d28, d1
	vmlal.s32	q7, d23, d6
	vmlal.s32	q7, d29, d0
	vst1.8		{d10-d11}, [r2, : 128]!
	vmull.s32	q5, d18, d3
	vmlal.s32	q5, d19, d2
	vmlal.s32	q5, d22, d1
	vmlal.s32	q5, d23, d0
	vmlal.s32	q5, d12, d8
	vst1.8		{d16-d17}, [r2, : 128]!
	vmull.s32	q4, d18, d8
	vmlal.s32	q4, d26, d2
	vmlal.s32	q4, d19, d7
	vmlal.s32	q4, d27, d1
	vmlal.s32	q4, d22, d6
	vmlal.s32	q4, d28, d0
	vmull.s32	q8, d18, d7
	vmlal.s32	q8, d26, d1
	vmlal.s32	q8, d19, d6
	vmlal.s32	q8, d27, d0
	add		r2, sp, #544
	vld1.8		{d20-d21}, [r2, : 128]
	vmlal.s32	q7, d24, d21
	vmlal.s32	q7, d25, d20
	vmlal.s32	q4, d23, d21
	vmlal.s32	q4, d29, d20
	vmlal.s32	q8, d22, d21
	vmlal.s32	q8, d28, d20
	vmlal.s32	q5, d24, d20
	vst1.8		{d14-d15}, [r2, : 128]
	vmull.s32	q7, d18, d6
	vmlal.s32	q7, d26, d0
	add		r2, sp, #624
	vld1.8		{d30-d31}, [r2, : 128]
	vmlal.s32	q2, d30, d21
	vmlal.s32	q7, d19, d21
	vmlal.s32	q7, d27, d20
	add		r2, sp, #592
	vld1.8		{d26-d27}, [r2, : 128]
	vmlal.s32	q4, d25, d27
	vmlal.s32	q8, d29, d27
	vmlal.s32	q8, d25, d26
	vmlal.s32	q7, d28, d27
	vmlal.s32	q7, d29, d26
	add		r2, sp, #576
	vld1.8		{d28-d29}, [r2, : 128]
	vmlal.s32	q4, d24, d29
	vmlal.s32	q8, d23, d29
	vmlal.s32	q8, d24, d28
	vmlal.s32	q7, d22, d29
	vmlal.s32	q7, d23, d28
	vst1.8		{d8-d9}, [r2, : 128]
	add		r2, sp, #528
	vld1.8		{d8-d9}, [r2, : 128]
	vmlal.s32	q7, d24, d9
	vmlal.s32	q7, d25, d31
	vmull.s32	q1, d18, d2
	vmlal.s32	q1, d19, d1
	vmlal.s32	q1, d22, d0
	vmlal.s32	q1, d24, d27
	vmlal.s32	q1, d23, d20
	vmlal.s32	q1, d12, d7
	vmlal.s32	q1, d13, d6
	vmull.s32	q6, d18, d1
	vmlal.s32	q6, d19, d0
	vmlal.s32	q6, d23, d27
	vmlal.s32	q6, d22, d20
	vmlal.s32	q6, d24, d26
	vmull.s32	q0, d18, d0
	vmlal.s32	q0, d22, d27
	vmlal.s32	q0, d23, d26
	vmlal.s32	q0, d24, d31
	vmlal.s32	q0, d19, d20
	add		r2, sp, #608
	vld1.8		{d18-d19}, [r2, : 128]
	vmlal.s32	q2, d18, d7
	vmlal.s32	q5, d18, d6
	vmlal.s32	q1, d18, d21
	vmlal.s32	q0, d18, d28
	vmlal.s32	q6, d18, d29
	vmlal.s32	q2, d19, d6
	vmlal.s32	q5, d19, d21
	vmlal.s32	q1, d19, d29
	vmlal.s32	q0, d19, d9
	vmlal.s32	q6, d19, d28
	add		r2, sp, #560
	vld1.8		{d18-d19}, [r2, : 128]
	add		r2, sp, #480
	vld1.8		{d22-d23}, [r2, : 128]
	vmlal.s32	q5, d19, d7
	vmlal.s32	q0, d18, d21
	vmlal.s32	q0, d19, d29
	vmlal.s32	q6, d18, d6
	add		r2, sp, #496
	vld1.8		{d6-d7}, [r2, : 128]
	vmlal.s32	q6, d19, d21
	add		r2, sp, #544
	vld1.8		{d18-d19}, [r2, : 128]
	vmlal.s32	q0, d30, d8
	add		r2, sp, #640
	vld1.8		{d20-d21}, [r2, : 128]
	vmlal.s32	q5, d30, d29
	add		r2, sp, #576
	vld1.8		{d24-d25}, [r2, : 128]
	vmlal.s32	q1, d30, d28
	vadd.i64	q13, q0, q11
	vadd.i64	q14, q5, q11
	vmlal.s32	q6, d30, d9
	vshr.s64	q4, q13, #26
	vshr.s64	q13, q14, #26
	vadd.i64	q7, q7, q4
	vshl.i64	q4, q4, #26
	vadd.i64	q14, q7, q3
	vadd.i64	q9, q9, q13
	vshl.i64	q13, q13, #26
	vadd.i64	q15, q9, q3
	vsub.i64	q0, q0, q4
	vshr.s64	q4, q14, #25
	vsub.i64	q5, q5, q13
	vshr.s64	q13, q15, #25
	vadd.i64	q6, q6, q4
	vshl.i64	q4, q4, #25
	vadd.i64	q14, q6, q11
	vadd.i64	q2, q2, q13
	vsub.i64	q4, q7, q4
	vshr.s64	q7, q14, #26
	vshl.i64	q13, q13, #25
	vadd.i64	q14, q2, q11
	vadd.i64	q8, q8, q7
	vshl.i64	q7, q7, #26
	vadd.i64	q15, q8, q3
	vsub.i64	q9, q9, q13
	vshr.s64	q13, q14, #26
	vsub.i64	q6, q6, q7
	vshr.s64	q7, q15, #25
	vadd.i64	q10, q10, q13
	vshl.i64	q13, q13, #26
	vadd.i64	q14, q10, q3
	vadd.i64	q1, q1, q7
	add		r2, r3, #240
	vshl.i64	q7, q7, #25
	add		r4, r3, #144
	vadd.i64	q15, q1, q11
	add		r2, r2, #8
	vsub.i64	q2, q2, q13
	add		r4, r4, #8
	vshr.s64	q13, q14, #25
	vsub.i64	q7, q8, q7
	vshr.s64	q8, q15, #26
	vadd.i64	q14, q13, q13
	vadd.i64	q12, q12, q8
	vtrn.32		d12, d14
	vshl.i64	q8, q8, #26
	vtrn.32		d13, d15
	vadd.i64	q3, q12, q3
	vadd.i64	q0, q0, q14
	vst1.8		d12, [r2, : 64]!
	vshl.i64	q7, q13, #4
	vst1.8		d13, [r4, : 64]!
	vsub.i64	q1, q1, q8
	vshr.s64	q3, q3, #25
	vadd.i64	q0, q0, q7
	vadd.i64	q5, q5, q3
	vshl.i64	q3, q3, #25
	vadd.i64	q6, q5, q11
	vadd.i64	q0, q0, q13
	vshl.i64	q7, q13, #25
	vadd.i64	q8, q0, q11
	vsub.i64	q3, q12, q3
	vshr.s64	q6, q6, #26
	vsub.i64	q7, q10, q7
	vtrn.32		d2, d6
	vshr.s64	q8, q8, #26
	vtrn.32		d3, d7
	vadd.i64	q3, q9, q6
	vst1.8		d2, [r2, : 64]
	vshl.i64	q6, q6, #26
	vst1.8		d3, [r4, : 64]
	vadd.i64	q1, q4, q8
	vtrn.32		d4, d14
	vshl.i64	q4, q8, #26
	vtrn.32		d5, d15
	vsub.i64	q5, q5, q6
	add		r2, r2, #16
	vsub.i64	q0, q0, q4
	vst1.8		d4, [r2, : 64]
	add		r4, r4, #16
	vst1.8		d5, [r4, : 64]
	vtrn.32		d10, d6
	vtrn.32		d11, d7
	sub		r2, r2, #8
	sub		r4, r4, #8
	vtrn.32		d0, d2
	vtrn.32		d1, d3
	vst1.8		d10, [r2, : 64]
	vst1.8		d11, [r4, : 64]
	sub		r2, r2, #24
	sub		r4, r4, #24
	vst1.8		d0, [r2, : 64]
	vst1.8		d1, [r4, : 64]
	ldr		r2, [sp, #456]
	ldr		r4, [sp, #460]
	subs		r5, r2, #1
	bge		.Lmainloop
	add		r1, r3, #144
	add		r2, r3, #336
	vld1.8		{d0-d1}, [r1, : 128]!
	vld1.8		{d2-d3}, [r1, : 128]!
	vld1.8		{d4}, [r1, : 64]
	vst1.8		{d0-d1}, [r2, : 128]!
	vst1.8		{d2-d3}, [r2, : 128]!
	vst1.8		d4, [r2, : 64]
	movw		r1, #0
.Linvertloop:
	add		r2, r3, #144
	movw		r4, #0
	movw		r5, #2
	cmp		r1, #1
	moveq		r5, #1
	addeq		r2, r3, #336
	addeq		r4, r3, #48
	cmp		r1, #2
	moveq		r5, #1
	addeq		r2, r3, #48
	cmp		r1, #3
	moveq		r5, #5
	addeq		r4, r3, #336
	cmp		r1, #4
	moveq		r5, #10
	cmp		r1, #5
	moveq		r5, #20
	cmp		r1, #6
	moveq		r5, #10
	addeq		r2, r3, #336
	addeq		r4, r3, #336
	cmp		r1, #7
	moveq		r5, #50
	cmp		r1, #8
	moveq		r5, #100
	cmp		r1, #9
	moveq		r5, #50
	addeq		r2, r3, #336
	cmp		r1, #10
	moveq		r5, #5
	addeq		r2, r3, #48
	cmp		r1, #11
	moveq		r5, #0
	addeq		r2, r3, #96
	add		r6, r3, #144
	add		r7, r3, #288
	vld1.8		{d0-d1}, [r6, : 128]!
	vld1.8		{d2-d3}, [r6, : 128]!
	vld1.8		{d4}, [r6, : 64]
	vst1.8		{d0-d1}, [r7, : 128]!
	vst1.8		{d2-d3}, [r7, : 128]!
	vst1.8		d4, [r7, : 64]
	cmp		r5, #0
	beq		.Lskipsquaringloop
.Lsquaringloop:
	add		r6, r3, #288
	add		r7, r3, #288
	add		r8, r3, #288
	vmov.i32	q0, #19
	vmov.i32	q1, #0
	vmov.i32	q2, #1
	vzip.i32	q1, q2
	vld1.8		{d4-d5}, [r7, : 128]!
	vld1.8		{d6-d7}, [r7, : 128]!
	vld1.8		{d9}, [r7, : 64]
	vld1.8		{d10-d11}, [r6, : 128]!
	add		r7, sp, #384
	vld1.8		{d12-d13}, [r6, : 128]!
	vmul.i32	q7, q2, q0
	vld1.8		{d8}, [r6, : 64]
	vext.32		d17, d11, d10, #1
	vmul.i32	q9, q3, q0
	vext.32		d16, d10, d8, #1
	vshl.u32	q10, q5, q1
	vext.32		d22, d14, d4, #1
	vext.32		d24, d18, d6, #1
	vshl.u32	q13, q6, q1
	vshl.u32	d28, d8, d2
	vrev64.i32	d22, d22
	vmul.i32	d1, d9, d1
	vrev64.i32	d24, d24
	vext.32		d29, d8, d13, #1
	vext.32		d0, d1, d9, #1
	vrev64.i32	d0, d0
	vext.32		d2, d9, d1, #1
	vext.32		d23, d15, d5, #1
	vmull.s32	q4, d20, d4
	vrev64.i32	d23, d23
	vmlal.s32	q4, d21, d1
	vrev64.i32	d2, d2
	vmlal.s32	q4, d26, d19
	vext.32		d3, d5, d15, #1
	vmlal.s32	q4, d27, d18
	vrev64.i32	d3, d3
	vmlal.s32	q4, d28, d15
	vext.32		d14, d12, d11, #1
	vmull.s32	q5, d16, d23
	vext.32		d15, d13, d12, #1
	vmlal.s32	q5, d17, d4
	vst1.8		d8, [r7, : 64]!
	vmlal.s32	q5, d14, d1
	vext.32		d12, d9, d8, #0
	vmlal.s32	q5, d15, d19
	vmov.i64	d13, #0
	vmlal.s32	q5, d29, d18
	vext.32		d25, d19, d7, #1
	vmlal.s32	q6, d20, d5
	vrev64.i32	d25, d25
	vmlal.s32	q6, d21, d4
	vst1.8		d11, [r7, : 64]!
	vmlal.s32	q6, d26, d1
	vext.32		d9, d10, d10, #0
	vmlal.s32	q6, d27, d19
	vmov.i64	d8, #0
	vmlal.s32	q6, d28, d18
	vmlal.s32	q4, d16, d24
	vmlal.s32	q4, d17, d5
	vmlal.s32	q4, d14, d4
	vst1.8		d12, [r7, : 64]!
	vmlal.s32	q4, d15, d1
	vext.32		d10, d13, d12, #0
	vmlal.s32	q4, d29, d19
	vmov.i64	d11, #0
	vmlal.s32	q5, d20, d6
	vmlal.s32	q5, d21, d5
	vmlal.s32	q5, d26, d4
	vext.32		d13, d8, d8, #0
	vmlal.s32	q5, d27, d1
	vmov.i64	d12, #0
	vmlal.s32	q5, d28, d19
	vst1.8		d9, [r7, : 64]!
	vmlal.s32	q6, d16, d25
	vmlal.s32	q6, d17, d6
	vst1.8		d10, [r7, : 64]
	vmlal.s32	q6, d14, d5
	vext.32		d8, d11, d10, #0
	vmlal.s32	q6, d15, d4
	vmov.i64	d9, #0
	vmlal.s32	q6, d29, d1
	vmlal.s32	q4, d20, d7
	vmlal.s32	q4, d21, d6
	vmlal.s32	q4, d26, d5
	vext.32		d11, d12, d12, #0
	vmlal.s32	q4, d27, d4
	vmov.i64	d10, #0
	vmlal.s32	q4, d28, d1
	vmlal.s32	q5, d16, d0
	sub		r6, r7, #32
	vmlal.s32	q5, d17, d7
	vmlal.s32	q5, d14, d6
	vext.32		d30, d9, d8, #0
	vmlal.s32	q5, d15, d5
	vld1.8		{d31}, [r6, : 64]!
	vmlal.s32	q5, d29, d4
	vmlal.s32	q15, d20, d0
	vext.32		d0, d6, d18, #1
	vmlal.s32	q15, d21, d25
	vrev64.i32	d0, d0
	vmlal.s32	q15, d26, d24
	vext.32		d1, d7, d19, #1
	vext.32		d7, d10, d10, #0
	vmlal.s32	q15, d27, d23
	vrev64.i32	d1, d1
	vld1.8		{d6}, [r6, : 64]
	vmlal.s32	q15, d28, d22
	vmlal.s32	q3, d16, d4
	add		r6, r6, #24
	vmlal.s32	q3, d17, d2
	vext.32		d4, d31, d30, #0
	vmov		d17, d11
	vmlal.s32	q3, d14, d1
	vext.32		d11, d13, d13, #0
	vext.32		d13, d30, d30, #0
	vmlal.s32	q3, d15, d0
	vext.32		d1, d8, d8, #0
	vmlal.s32	q3, d29, d3
	vld1.8		{d5}, [r6, : 64]
	sub		r6, r6, #16
	vext.32		d10, d6, d6, #0
	vmov.i32	q1, #0xffffffff
	vshl.i64	q4, q1, #25
	add		r7, sp, #480
	vld1.8		{d14-d15}, [r7, : 128]
	vadd.i64	q9, q2, q7
	vshl.i64	q1, q1, #26
	vshr.s64	q10, q9, #26
	vld1.8		{d0}, [r6, : 64]!
	vadd.i64	q5, q5, q10
	vand		q9, q9, q1
	vld1.8		{d16}, [r6, : 64]!
	add		r6, sp, #496
	vld1.8		{d20-d21}, [r6, : 128]
	vadd.i64	q11, q5, q10
	vsub.i64	q2, q2, q9
	vshr.s64	q9, q11, #25
	vext.32		d12, d5, d4, #0
	vand		q11, q11, q4
	vadd.i64	q0, q0, q9
	vmov		d19, d7
	vadd.i64	q3, q0, q7
	vsub.i64	q5, q5, q11
	vshr.s64	q11, q3, #26
	vext.32		d18, d11, d10, #0
	vand		q3, q3, q1
	vadd.i64	q8, q8, q11
	vadd.i64	q11, q8, q10
	vsub.i64	q0, q0, q3
	vshr.s64	q3, q11, #25
	vand		q11, q11, q4
	vadd.i64	q3, q6, q3
	vadd.i64	q6, q3, q7
	vsub.i64	q8, q8, q11
	vshr.s64	q11, q6, #26
	vand		q6, q6, q1
	vadd.i64	q9, q9, q11
	vadd.i64	d25, d19, d21
	vsub.i64	q3, q3, q6
	vshr.s64	d23, d25, #25
	vand		q4, q12, q4
	vadd.i64	d21, d23, d23
	vshl.i64	d25, d23, #4
	vadd.i64	d21, d21, d23
	vadd.i64	d25, d25, d21
	vadd.i64	d4, d4, d25
	vzip.i32	q0, q8
	vadd.i64	d12, d4, d14
	add		r6, r8, #8
	vst1.8		d0, [r6, : 64]
	vsub.i64	d19, d19, d9
	add		r6, r6, #16
	vst1.8		d16, [r6, : 64]
	vshr.s64	d22, d12, #26
	vand		q0, q6, q1
	vadd.i64	d10, d10, d22
	vzip.i32	q3, q9
	vsub.i64	d4, d4, d0
	sub		r6, r6, #8
	vst1.8		d6, [r6, : 64]
	add		r6, r6, #16
	vst1.8		d18, [r6, : 64]
	vzip.i32	q2, q5
	sub		r6, r6, #32
	vst1.8		d4, [r6, : 64]
	subs		r5, r5, #1
	bhi		.Lsquaringloop
.Lskipsquaringloop:
	mov		r2, r2
	add		r5, r3, #288
	add		r6, r3, #144
	vmov.i32	q0, #19
	vmov.i32	q1, #0
	vmov.i32	q2, #1
	vzip.i32	q1, q2
	vld1.8		{d4-d5}, [r5, : 128]!
	vld1.8		{d6-d7}, [r5, : 128]!
	vld1.8		{d9}, [r5, : 64]
	vld1.8		{d10-d11}, [r2, : 128]!
	add		r5, sp, #384
	vld1.8		{d12-d13}, [r2, : 128]!
	vmul.i32	q7, q2, q0
	vld1.8		{d8}, [r2, : 64]
	vext.32		d17, d11, d10, #1
	vmul.i32	q9, q3, q0
	vext.32		d16, d10, d8, #1
	vshl.u32	q10, q5, q1
	vext.32		d22, d14, d4, #1
	vext.32		d24, d18, d6, #1
	vshl.u32	q13, q6, q1
	vshl.u32	d28, d8, d2
	vrev64.i32	d22, d22
	vmul.i32	d1, d9, d1
	vrev64.i32	d24, d24
	vext.32		d29, d8, d13, #1
	vext.32		d0, d1, d9, #1
	vrev64.i32	d0, d0
	vext.32		d2, d9, d1, #1
	vext.32		d23, d15, d5, #1
	vmull.s32	q4, d20, d4
	vrev64.i32	d23, d23
	vmlal.s32	q4, d21, d1
	vrev64.i32	d2, d2
	vmlal.s32	q4, d26, d19
	vext.32		d3, d5, d15, #1
	vmlal.s32	q4, d27, d18
	vrev64.i32	d3, d3
	vmlal.s32	q4, d28, d15
	vext.32		d14, d12, d11, #1
	vmull.s32	q5, d16, d23
	vext.32		d15, d13, d12, #1
	vmlal.s32	q5, d17, d4
	vst1.8		d8, [r5, : 64]!
	vmlal.s32	q5, d14, d1
	vext.32		d12, d9, d8, #0
	vmlal.s32	q5, d15, d19
	vmov.i64	d13, #0
	vmlal.s32	q5, d29, d18
	vext.32		d25, d19, d7, #1
	vmlal.s32	q6, d20, d5
	vrev64.i32	d25, d25
	vmlal.s32	q6, d21, d4
	vst1.8		d11, [r5, : 64]!
	vmlal.s32	q6, d26, d1
	vext.32		d9, d10, d10, #0
	vmlal.s32	q6, d27, d19
	vmov.i64	d8, #0
	vmlal.s32	q6, d28, d18
	vmlal.s32	q4, d16, d24
	vmlal.s32	q4, d17, d5
	vmlal.s32	q4, d14, d4
	vst1.8		d12, [r5, : 64]!
	vmlal.s32	q4, d15, d1
	vext.32		d10, d13, d12, #0
	vmlal.s32	q4, d29, d19
	vmov.i64	d11, #0
	vmlal.s32	q5, d20, d6
	vmlal.s32	q5, d21, d5
	vmlal.s32	q5, d26, d4
	vext.32		d13, d8, d8, #0
	vmlal.s32	q5, d27, d1
	vmov.i64	d12, #0
	vmlal.s32	q5, d28, d19
	vst1.8		d9, [r5, : 64]!
	vmlal.s32	q6, d16, d25
	vmlal.s32	q6, d17, d6
	vst1.8		d10, [r5, : 64]
	vmlal.s32	q6, d14, d5
	vext.32		d8, d11, d10, #0
	vmlal.s32	q6, d15, d4
	vmov.i64	d9, #0
	vmlal.s32	q6, d29, d1
	vmlal.s32	q4, d20, d7
	vmlal.s32	q4, d21, d6
	vmlal.s32	q4, d26, d5
	vext.32		d11, d12, d12, #0
	vmlal.s32	q4, d27, d4
	vmov.i64	d10, #0
	vmlal.s32	q4, d28, d1
	vmlal.s32	q5, d16, d0
	sub		r2, r5, #32
	vmlal.s32	q5, d17, d7
	vmlal.s32	q5, d14, d6
	vext.32		d30, d9, d8, #0
	vmlal.s32	q5, d15, d5
	vld1.8		{d31}, [r2, : 64]!
	vmlal.s32	q5, d29, d4
	vmlal.s32	q15, d20, d0
	vext.32		d0, d6, d18, #1
	vmlal.s32	q15, d21, d25
	vrev64.i32	d0, d0
	vmlal.s32	q15, d26, d24
	vext.32		d1, d7, d19, #1
	vext.32		d7, d10, d10, #0
	vmlal.s32	q15, d27, d23
	vrev64.i32	d1, d1
	vld1.8		{d6}, [r2, : 64]
	vmlal.s32	q15, d28, d22
	vmlal.s32	q3, d16, d4
	add		r2, r2, #24
	vmlal.s32	q3, d17, d2
	vext.32		d4, d31, d30, #0
	vmov		d17, d11
	vmlal.s32	q3, d14, d1
	vext.32		d11, d13, d13, #0
	vext.32		d13, d30, d30, #0
	vmlal.s32	q3, d15, d0
	vext.32		d1, d8, d8, #0
	vmlal.s32	q3, d29, d3
	vld1.8		{d5}, [r2, : 64]
	sub		r2, r2, #16
	vext.32		d10, d6, d6, #0
	vmov.i32	q1, #0xffffffff
	vshl.i64	q4, q1, #25
	add		r5, sp, #480
	vld1.8		{d14-d15}, [r5, : 128]
	vadd.i64	q9, q2, q7
	vshl.i64	q1, q1, #26
	vshr.s64	q10, q9, #26
	vld1.8		{d0}, [r2, : 64]!
	vadd.i64	q5, q5, q10
	vand		q9, q9, q1
	vld1.8		{d16}, [r2, : 64]!
	add		r2, sp, #496
	vld1.8		{d20-d21}, [r2, : 128]
	vadd.i64	q11, q5, q10
	vsub.i64	q2, q2, q9
	vshr.s64	q9, q11, #25
	vext.32		d12, d5, d4, #0
	vand		q11, q11, q4
	vadd.i64	q0, q0, q9
	vmov		d19, d7
	vadd.i64	q3, q0, q7
	vsub.i64	q5, q5, q11
	vshr.s64	q11, q3, #26
	vext.32		d18, d11, d10, #0
	vand		q3, q3, q1
	vadd.i64	q8, q8, q11
	vadd.i64	q11, q8, q10
	vsub.i64	q0, q0, q3
	vshr.s64	q3, q11, #25
	vand		q11, q11, q4
	vadd.i64	q3, q6, q3
	vadd.i64	q6, q3, q7
	vsub.i64	q8, q8, q11
	vshr.s64	q11, q6, #26
	vand		q6, q6, q1
	vadd.i64	q9, q9, q11
	vadd.i64	d25, d19, d21
	vsub.i64	q3, q3, q6
	vshr.s64	d23, d25, #25
	vand		q4, q12, q4
	vadd.i64	d21, d23, d23
	vshl.i64	d25, d23, #4
	vadd.i64	d21, d21, d23
	vadd.i64	d25, d25, d21
	vadd.i64	d4, d4, d25
	vzip.i32	q0, q8
	vadd.i64	d12, d4, d14
	add		r2, r6, #8
	vst1.8		d0, [r2, : 64]
	vsub.i64	d19, d19, d9
	add		r2, r2, #16
	vst1.8		d16, [r2, : 64]
	vshr.s64	d22, d12, #26
	vand		q0, q6, q1
	vadd.i64	d10, d10, d22
	vzip.i32	q3, q9
	vsub.i64	d4, d4, d0
	sub		r2, r2, #8
	vst1.8		d6, [r2, : 64]
	add		r2, r2, #16
	vst1.8		d18, [r2, : 64]
	vzip.i32	q2, q5
	sub		r2, r2, #32
	vst1.8		d4, [r2, : 64]
	cmp		r4, #0
	beq		.Lskippostcopy
	add		r2, r3, #144
	mov		r4, r4
	vld1.8		{d0-d1}, [r2, : 128]!
	vld1.8		{d2-d3}, [r2, : 128]!
	vld1.8		{d4}, [r2, : 64]
	vst1.8		{d0-d1}, [r4, : 128]!
	vst1.8		{d2-d3}, [r4, : 128]!
	vst1.8		d4, [r4, : 64]
.Lskippostcopy:
	cmp		r1, #1
	bne		.Lskipfinalcopy
	add		r2, r3, #288
	add		r4, r3, #144
	vld1.8		{d0-d1}, [r2, : 128]!
	vld1.8		{d2-d3}, [r2, : 128]!
	vld1.8		{d4}, [r2, : 64]
	vst1.8		{d0-d1}, [r4, : 128]!
	vst1.8		{d2-d3}, [r4, : 128]!
	vst1.8		d4, [r4, : 64]
.Lskipfinalcopy:
	add		r1, r1, #1
	cmp		r1, #12
	blo		.Linvertloop
	add		r1, r3, #144
	ldr		r2, [r1], #4
	ldr		r3, [r1], #4
	ldr		r4, [r1], #4
	ldr		r5, [r1], #4
	ldr		r6, [r1], #4
	ldr		r7, [r1], #4
	ldr		r8, [r1], #4
	ldr		r9, [r1], #4
	ldr		r10, [r1], #4
	ldr		r1, [r1]
	add		r11, r1, r1, LSL #4
	add		r11, r11, r1, LSL #1
	add		r11, r11, #16777216
	mov		r11, r11, ASR #25
	add		r11, r11, r2
	mov		r11, r11, ASR #26
	add		r11, r11, r3
	mov		r11, r11, ASR #25
	add		r11, r11, r4
	mov		r11, r11, ASR #26
	add		r11, r11, r5
	mov		r11, r11, ASR #25
	add		r11, r11, r6
	mov		r11, r11, ASR #26
	add		r11, r11, r7
	mov		r11, r11, ASR #25
	add		r11, r11, r8
	mov		r11, r11, ASR #26
	add		r11, r11, r9
	mov		r11, r11, ASR #25
	add		r11, r11, r10
	mov		r11, r11, ASR #26
	add		r11, r11, r1
	mov		r11, r11, ASR #25
	add		r2, r2, r11
	add		r2, r2, r11, LSL #1
	add		r2, r2, r11, LSL #4
	mov		r11, r2, ASR #26
	add		r3, r3, r11
	sub		r2, r2, r11, LSL #26
	mov		r11, r3, ASR #25
	add		r4, r4, r11
	sub		r3, r3, r11, LSL #25
	mov		r11, r4, ASR #26
	add		r5, r5, r11
	sub		r4, r4, r11, LSL #26
	mov		r11, r5, ASR #25
	add		r6, r6, r11
	sub		r5, r5, r11, LSL #25
	mov		r11, r6, ASR #26
	add		r7, r7, r11
	sub		r6, r6, r11, LSL #26
	mov		r11, r7, ASR #25
	add		r8, r8, r11
	sub		r7, r7, r11, LSL #25
	mov		r11, r8, ASR #26
	add		r9, r9, r11
	sub		r8, r8, r11, LSL #26
	mov		r11, r9, ASR #25
	add		r10, r10, r11
	sub		r9, r9, r11, LSL #25
	mov		r11, r10, ASR #26
	add		r1, r1, r11
	sub		r10, r10, r11, LSL #26
	mov		r11, r1, ASR #25
	sub		r1, r1, r11, LSL #25
	add		r2, r2, r3, LSL #26
	mov		r3, r3, LSR #6
	add		r3, r3, r4, LSL #19
	mov		r4, r4, LSR #13
	add		r4, r4, r5, LSL #13
	mov		r5, r5, LSR #19
	add		r5, r5, r6, LSL #6
	add		r6, r7, r8, LSL #25
	mov		r7, r8, LSR #7
	add		r7, r7, r9, LSL #19
	mov		r8, r9, LSR #13
	add		r8, r8, r10, LSL #12
	mov		r9, r10, LSR #20
	add		r1, r9, r1, LSL #6
	str		r2, [r0]
	str		r3, [r0, #4]
	str		r4, [r0, #8]
	str		r5, [r0, #12]
	str		r6, [r0, #16]
	str		r7, [r0, #20]
	str		r8, [r0, #24]
	str		r1, [r0, #28]
	movw		r0, #0
	mov		sp, ip
	pop		{r4-r11, pc}
ENDPROC(curve25519_neon)
